package com.jarveis.frame.lang;

import java.math.BigDecimal;

import org.apache.log4j.Logger;

/**
 * 数字工具类
 * 
 * @author liuguojun
 * 
 */
public class NumberUtil {
	
	private static final Logger logger = Logger.getLogger(NumberUtil.class);

	/**
	 * 验证数字是否为零或用于验证数字是否初始化
	 * 
	 * <pre>
	 * boolean b1 = NumberUtil.isZero(0);
	 * b1 = false;
	 * 
	 * boolean b2 = NumberUtil.isZero(1);
	 * b2 = true;
	 * 
	 * boolean b3 = NumberUtil.isZero(-1);
	 * b3 = true;
	 * </pre>
	 * 
	 * @param i
	 * @return boolean
	 */
	public static boolean isZero(int i) {
		return (i != 0);
	}

	/**
	 * 验证数字是否为零或用于验证数字是否初始化
	 * 
	 * <pre>
	 * NumberUtil.isZero(0) = false;
	 * NumberUtil.isZero(1) = true;
	 * NumberUtil.isZero(-1) = true;
	 * </pre>
	 * 
	 * @param i
	 * @return boolean
	 */
	public static boolean isZero(long l) {
		return (l != 0);
	}

	/**
	 * 验证数字是否为零或用于验证数字是否初始化
	 * 
	 * <pre>
	 * NumberUtil.isZero(0.0) = false;
	 * NumberUtil.isZero(0.1) = true;
	 * </pre>
	 * 
	 * @param i
	 * @return boolean
	 */
	public static boolean isZero(float f) {
		return (f != 0.0);
	}

	/**
	 * 验证数字是否为零或用于验证数字是否初始化
	 * 
	 * <pre>
	 * NumberUtil.isZero(0.0) = false;
	 * NumberUtil.isZero(0.1) = true;
	 * </pre>
	 * 
	 * @param i
	 * @return boolean
	 */
	public static boolean isZero(double d) {
		return (d != 0.0);
	}

	/**
	 * 解析字符串获得浮点型数值，
	 * 
	 * <pre>
	 * NumberUtil.getNumber(&quot;这书的价格是59元&quot;) = 59;
	 * NumberUtil.getNumber(&quot;这书的价格是59.9元&quot;) = 59.9;
	 * </pre>
	 * 
	 * @param str
	 * @return float
	 */
	public static BigDecimal getNumber(String str) {
		BigDecimal number = new BigDecimal(0);
		if (!StringUtil.isBlank(str)) {
			StringBuffer bf = new StringBuffer();
			char[] chars = str.toCharArray();
			for (int i = 0; i < chars.length; i++) {
				char c = chars[i];
				if (c >= '0' && c <= '9') {
					bf.append(c);
				} else if (c == '.') {
					if (bf.length() == 0) {
						continue;
					} else if (bf.indexOf(Character.toString(c)) != -1) {
						break;
					} else {
						bf.append(c);
					}
				} else if (c == '-' || c == '+') {
					if (bf.length() > 0) {
						break;
					} else if (bf.indexOf(Character.toString(c)) != -1) {
						break;
					} else {
						bf.append(c);
					}
				} else {
					if (bf.length() != 0) {
						break;
					}
				}
			}
			try {
				if (!(bf.length() == 1 && (bf.charAt(0) == '-' || bf.charAt(0) == '+'))) {
					number = new BigDecimal(bf.toString());
				}
			} catch (NumberFormatException ex) {
				logger.error(ex.getMessage(), ex);
			}
		}
		return number;
	}

	/**
	 * 转换字符串为整数型数字
	 * 
	 * <pre>
	 * NumberUtil.parseInt(&quot;123&quot;) = 123;
	 * NumberUtil.parseInt(&quot;12a&quot;) = 0;
	 * </pre>
	 * 
	 * @param str
	 * @return int
	 */
	public static int parseInt(String str) {
		int value = 0;
		try {
			value = Integer.parseInt(str.trim());
		} catch (NumberFormatException ex) {
			logger.error(ex.getMessage(), ex);
		}
		return value;
	}

	/**
	 * 转换字符串为整数型数字
	 * 
	 * <pre>
	 * NumberUtil.parseLong(&quot;123&quot;) = 123;
	 * NumberUtil.parseLong(&quot;12a&quot;) = 0;
	 * </pre>
	 * 
	 * @param str
	 * @return long
	 */
	public static long parseLong(String str) {
		Long value = 0L;
		try {
			value = Long.parseLong(str.trim());
		} catch (NumberFormatException ex) {
			logger.error(ex.getMessage(), ex);
		}
		return value;
	}

	/**
	 * 转换字符串为浮点型数字
	 * 
	 * <pre>
	 * NumberUtil.parseFloat(&quot;12.3&quot;) = 12.3;
	 * NumberUtil.parseFloat(&quot;12a&quot;) = 0;
	 * </pre>
	 * 
	 * @param str
	 * @return float
	 */
	public static float parseFloat(String str) {
		float value = 0f;
		try {
			value = Float.parseFloat(str.trim());
		} catch (NumberFormatException ex) {
			logger.error(ex.getMessage(), ex);
		}
		return value;
	}

	/**
	 * 找出数组中最小的那个数，并返回
	 * 
	 * @param arr
	 * @return int
	 */
	public static int min(int[] arr) {
		int[] temp = arr.clone();

		for (int i = temp.length - 1; i > 0; i--) {
			if (temp[i] < temp[i - 1]) {
				temp[i - 1] = temp[i];
			}
		}

		return temp[0];
	}

	/**
	 * 找出数组中最小的那个数，并返回
	 * 
	 * @param arr
	 * @return int
	 */
	public static float min(float[] arr) {
		float[] temp = arr.clone();

		for (int i = temp.length - 1; i > 0; i--) {
			if (temp[i] < temp[i - 1]) {
				temp[i - 1] = temp[i];
			}
		}

		return temp[0];
	}

	/**
	 * 找出数据中最大的那个数并返回
	 * 
	 * @param arr
	 * @return int
	 */
	public static int max(int[] arr) {
		int[] temp = arr.clone();

		for (int i = temp.length - 1; i > 0; i--) {
			if (temp[i] > temp[i - 1]) {
				temp[i - 1] = temp[i];
			}
		}

		return temp[0];
	}

	/**
	 * 找出数据中最大的那个数并返回
	 * 
	 * @param arr
	 * @return int
	 */
	public static float max(float[] arr) {
		float[] temp = arr.clone();

		for (int i = temp.length - 1; i > 0; i--) {
			if (temp[i] > temp[i - 1]) {
				temp[i - 1] = temp[i];
			}
		}

		return temp[0];
	}
}
